package com.icss.utils;

import java.util.*;

/**
 * @author 韦锦良
 *　类的作用：用来保存从数据库中读取出来的数据行，并且保存当前页的一些信息
 * 最后修改时间：2010-3-28　上午11:36:31
 * 最后的改动内容：初始版本
 */
@SuppressWarnings("serial")
public class RecordSet extends ArrayList {

	// 记录集信息
	/** 总页数 */

	public int totalPage = -1;

	/** 当前页号 */
	public int currentPage = -1;

	/** 每页最大记录数 */
	public int pageSize = -1;

	/** 当前页所含记录数 */
	public int currentPageSize = -1;

	/** 总记录数 */
	public int totalRecordCount = -1;

	/** 当前指向的记录位置 ( 初始位置在第一条记录之前的空位上 ) */
	private int currentRecordRow = 0;

	/**
	 * 取得当前记录的位置
	 * @return 记录的位置
	 */
	public int getRow() {
		return currentRecordRow;
	}

	/**
	 * 得到第n条记录
	 * @param i 记录位置 ( 取值范围: 1--返回的记录数 )
	 * @return 成功返回记录, 异常或失败返回 false
	 */
	public Record getRecord(int i) {
		try {
			return (Record) this.get(i - 1);
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 得到当前记录
	 * @return 成功返回记录, 异常或失败返回 false
	 */
	public Record getRecord() {
		if (isBeforeFirst()) {
			//Log.warn("指针在初始位置, 请使用 first() 或 next() 方法将指针指向第一条记录");
			return null;
		}
		if (isAfterLast()) {
			//Log.warn("指针在结束位置, 请使用 first() 方法将指针指向第一条记录");
			return null;
		}
		return getRecord(currentRecordRow);
	}

	/**
	 * 定位到绝对位置的记录
	 * @param row 记录位置 ( 0--返回的记录数+1 )
	 * @return 成功返回 true, 异常或失败返回 false
	 */
	public boolean absolute(int row) {
		if (0 <= row && row <= this.size() + 1) {
			currentRecordRow = row;
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 定位到首条记录之前
	 */
	public void beforeFirst() {
		currentRecordRow = 0;
	}

	/**
	 * 定位到末条记录之后
	 */
	public void afterLast() {
		currentRecordRow = this.size() + 1;
	}

	/**
	 * 定位到首条记录
	 * @return 成功返回 true, 失败返回 false
	 */
	public boolean first() {
		if (this.isEmpty()) {
			return false;
		} else {
			currentRecordRow = 1;
			return true;
		}
	}

	/**
	 * 定位到末条记录
	 * @return 成功返回 true, 失败返回 false
	 */
	public boolean last() {
		if (this.isEmpty()) {
			return false;
		} else {
			currentRecordRow = this.size();
			return true;
		}
	}

	/**
	 * 是否在首条记录之前
	 * @return 是返回 true, 否返回 false
	 */
	public boolean isBeforeFirst() {
		if (currentRecordRow == 0) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 是否在末条记录之后
	 * @return 是返回 true, 否返回 false
	 */
	public boolean isAfterLast() {
		if (currentRecordRow == this.size() + 1) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 是否位于首条记录
	 * @return 是返回 true, 否返回 false
	 */
	public boolean isFirst() {
		if (this.isEmpty()) {
			return false;
		} else {
			if (currentRecordRow == 1) {
				return true;
			} else {
				return false;
			}
		}
	}

	/**
	 * 是否位于末条记录
	 * @return 是返回 true, 否返回 false
	 */
	public boolean isLast() {
		if (this.isEmpty()) {
			return false;
		} else {
			if (currentRecordRow == this.size()) {
				return true;
			} else {
				return false;
			}
		}
	}

	/**
	 * 定位到前一条记录
	 * @return 成功返回 true, 失败返回 false
	 */
	public boolean previous() {
		if (currentRecordRow < 1) {
			return false;
		} else {
			currentRecordRow--;
			if (currentRecordRow < 1) {
				return false;
			} else {
				return true;
			}
		}
	}

	/**
	 * 定位到后一条记录
	 * @return 成功返回 true, 失败返回 false
	 */
	public boolean next() {
		if (currentRecordRow > this.size()) {
			return false;
		} else {
			currentRecordRow++;
			if (currentRecordRow > this.size()) {
				return false;
			} else {
				return true;
			}
		}
	}

	/**
	 * 得到数字(推荐使用这个方法得到数字, 可以避免各种数据库数据类型不同而产生的问题)
	 * @param key 字段名
	 * @return 数字
	 */
	public double getNumber(String key) {
		return Double.parseDouble(getString(key));
	}

	/**
	 * 得到 String 类型的值(用 getObject 方法取得, 并使用了 trim 方法去掉两端空格, 当对象为空时返回空字符串)
	 * @param key 字段名
	 * @return String 类型的值
	 */
	public String getString(String key) {
		Object obj = this.getRecord().getObject(key);
		if (obj == null) {
			return "";
		} else {
			return obj.toString().trim();
		}
	}

	/**
	 * 得到 Timestamp 类型的值
	 * @param key 字段名
	 * @return Timestamp 类型的值
	 */
	public java.sql.Timestamp getTimestamp(String key) {
		return this.getRecord().getTimestamp(key);
	}

	/**
	 * 得到 Date 类型的值
	 * @param key 字段名
	 * @return Date 类型的值
	 */
	public java.sql.Date getDate(String key) {
		return this.getRecord().getDate(key);
	}

	/**
	 * 得到 Time 类型的值
	 * @param key 字段名
	 * @return Time 类型的值
	 */
	public java.sql.Time getTime(String key) {
		return this.getRecord().getTime(key);
	}

	/**
	 * 得到 BigDecimal 类型的值
	 * @param key 字段名
	 * @return BigDecimal 类型的值
	 */
	public java.math.BigDecimal getBigDecimal(String key) {
		return this.getRecord().getBigDecimal(key);
	}

	/**
	 * 得到 long 类型的值
	 * @param key 字段名
	 * @return long 类型的值
	 */
	public long getLong(String key) {
		return this.getRecord().getLong(key).longValue();
	}

	/**
	 * 得到 int 类型的值
	 * @param key 字段名
	 * @return int 类型的值
	 */
	public int getInt(String key) {
		return this.getRecord().getInteger(key).intValue();
	}

	/**
	 * 得到 short 类型的值
	 * @param key 字段名
	 * @return short 类型的值
	 */
	public short getShort(String key) {
		return this.getRecord().getShort(key).shortValue();
	}

	/**
	 * 得到 double 类型的值
	 * @param key 字段名
	 * @return double 类型的值
	 */
	public double getDouble(String key) {
		return this.getRecord().getDouble(key).doubleValue();
	}

	/**
	 * 得到 float 类型的值
	 * @param key 字段名
	 * @return float 类型的值
	 */
	public float getFloat(String key) {
		return this.getRecord().getFloat(key).floatValue();
	}

	/**
	 * 得到 boolean 类型的值
	 * @param key 字段名
	 * @return boolean 类型的值
	 */
	public boolean getBoolean(String key) {
		return this.getRecord().getBoolean(key).booleanValue();
	}

	/**
	 * 得到 byte 类型的值
	 * @param key 字段名
	 * @return byte 类型的值
	 */
	public byte getByte(String key) {
		return this.getRecord().getByte(key).byteValue();
	}

	/**
	 * 得到 byte[] 类型的值
	 * @param key 字段名
	 * @return byte[] 类型的值
	 */
	public byte[] getBytes(String key) {
		return this.getRecord().getBytes(key);
	}

	/**
	 * 得到 Blob 类型的值
	 * @param key 字段名
	 * @return Blob 类型的值
	 */
	public java.sql.Blob getBlob(String key) {
		return this.getRecord().getBlob(key);
	}

	/**
	 * 得到 Clob 类型的值
	 * @param key 字段名
	 * @return Clob 类型的值
	 */
	public java.sql.Clob getClob(String key) {
		return this.getRecord().getClob(key);
	}

	/**
	 * 得到 Array 类型的值
	 * @param key 字段名
	 * @return Array 类型的值
	 */
	public java.sql.Array getArray(String key) {
		return this.getRecord().getArray(key);
	}

	/**
	 * 得到 InputStream 类型的值
	 * @param key 字段名
	 * @return InputStream 类型的值
	 */
	public java.io.InputStream getBinaryStream(String key) {
		return this.getRecord().getBinaryStream(key);
	}

	/**
	 * 得到 Object 类型的值
	 * 注意: 如果字段为 char 类型, 要注意返回的值尾部是否有多余的空格
	 * @param key 字段名
	 * @return Object 类型的值
	 */
	public Object getObject(String key) {
		return this.getRecord().getObject(key);
	}

	/**
	 * 返回相邻的页号
	 * @param size 相邻的页数
	 * @return 成功返回所有相邻的页号集合, 失败返回 null
	 */
	public int[] getNeighbouringPage(int size) {
		try {
			int left = (this.currentPage - 1 > size) ? size : this.currentPage - 1;
			int right = (this.totalPage - this.currentPage > size) ? size : this.totalPage - this.currentPage;
			int begin = this.currentPage - left;
			int[] num = new int[left + 1 + right];
			for (int i = 0; i < num.length; i++) {
				num[i] = begin + i;
			}
			return num;
		} catch (Exception e) {
			//Log.error(e);
			return null;
		}
	}

	/**
	 * 与另一个记录集合并
	 * @param rs 记录集
	 */
	
	@SuppressWarnings("unchecked")
	public void merge(RecordSet rs) {
		try {
			rs.beforeFirst();
			while (rs.next()) {
				this.add(rs.getRecord());
			}
			this.totalRecordCount += rs.totalRecordCount;
			this.beforeFirst();
		} catch (Exception e) {
			//Log.error(e);
		}
	}


}
